home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * $Source: /unixb/home/unixlib/source/unixlib37/src/unix/c/RCS/fcntl,v $
- * $Date: 1996/10/30 21:59:01 $
- * $Revision: 1.2 $
- * $State: Rel $
- * $Author: unixlib $
- *
- * $Log: fcntl,v $
- * Revision 1.2 1996/10/30 21:59:01 unixlib
- * Massive changes made by Nick Burret and Peter Burwood.
- *
- * Revision 1.1 1996/04/19 21:35:27 simon
- * Initial revision
- *
- ***************************************************************************/
-
- static const char rcs_id[] = "$Id: fcntl,v 1.2 1996/10/30 21:59:01 unixlib Rel $";
-
- #include <errno.h>
- #include <fcntl.h>
- #include <stdarg.h>
- #include <unistd.h>
- #include <sys/unix.h>
-
- int
- fcntl (int fd, int cmd, ...)
- {
- va_list ap;
- register struct file *f;
- int arg;
-
- va_start (ap, cmd);
-
- if (BADF (fd))
- {
- errno = EBADF;
- va_end (ap);
- return (-1);
- }
-
- f = __u->file + fd;
-
- switch (cmd)
- {
- case F_DUPFD:
- {
- register struct file *_f;
- arg = va_arg (ap, int);
-
- _f = __u->file + arg;
- while (arg < MAXFD && _f->dup)
- arg++, _f++;
- if (arg >= MAXFD)
- {
- errno = EMFILE;
- va_end (ap);
- return (-1);
- }
- }
- va_end (ap);
- return (dup2 (fd, arg));
- break;
- case F_GETFD:
- va_end (ap);
- return ((f->oflag & O_EXECCL) ? 1 : 0);
- break;
- case F_SETFD:
- arg = va_arg (ap, int);
-
- f->oflag = (f->oflag & (~O_EXECCL)) | \
- ((arg & 1) ? O_EXECCL : 0);
- va_end (ap);
- return (0);
- break;
- case F_GETFL:
- va_end (ap);
- return (f->oflag);
- break;
- case F_SETFL:
- arg = va_arg (ap, int);
-
- f->oflag = (f->oflag & ~(O_APPEND | O_NDELAY)) | \
- (arg & (O_APPEND | O_NDELAY));
- va_end (ap);
- return (0);
- break;
- default:
- errno = EINVAL;
- va_end (ap);
- return (-1);
- break;
- }
- va_end (ap);
- return -1;
- }
-